﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Linq;
using System.Linq;
using RC.ControlAcceso.BaseDatos;

namespace RC.ControlAcceso.ObjetosNegocio
{
    // NOTA: informeUsuario = clase de linq
    //       InformeUsuario = clase de negocio
        
 
    /// <summary>
    /// Propiedades y métodos derivados.
    /// </summary>
    public partial class InformeUsuario
    {
        /// <summary>
        /// El legajo se obtiene del nombre de la persona con el siguiente formato "(265)". Es entre paréntesis
        /// </summary>
        public int NumeroLegajo
        {
            //extraigo el numero de entre los corchetes
            get 
            {
                try
                {
                    int _primerParentesis = Empleado.IndexOf(char.Parse("(")) + 1;
                    int _segundoParentesis = Empleado.IndexOf(char.Parse(")"));
                    string _numeroString = Empleado.Substring(_primerParentesis, _segundoParentesis - _primerParentesis);
                    int _numero;
                    if (int.TryParse(_numeroString, out _numero) == false)
                        _numero = -1;

                    return _numero;
                }
                catch
                {
                    return -1;
                }
            }
        }
    }
    public partial class InformeUsuario
    {
        RC.ControlAcceso.BaseDatos.LinqDALDataContext _DB = new RC.ControlAcceso.BaseDatos.LinqDALDataContext();

        public enum enuTipoEvento
        {
            Entrada,
            Salida,
            No_Definido
        }

        #region Atributos
        private int _ID;
        private DateTime _FechaYHora;
        private enuTipoEvento _Evento;
        private string _Lector;
        private string _Empleado;
        #endregion

        #region Propiedades
        public int ID
        {
            get { return _ID; }
            set { _ID = value; }
        }
        public DateTime FechaYHora
        {
            get { return _FechaYHora; }
            set { _FechaYHora = value; }
        }
        public enuTipoEvento Evento
        {
            get { return _Evento; }
            set { _Evento = value; }
        }
        public string Lector
        {
            get { return _Lector; }
            set { _Lector = value; }
        }
        public string Empleado
        {
            get { return _Empleado; }
            set { _Empleado = value; }
        }
        #endregion

        public void Insertar(string pEmpleado, string pEvento, DateTime pFechaHora, string pLector)
        {
            informeusuario _informeUsuario = new informeusuario();

            _informeUsuario.Empleado = pEmpleado;
            _informeUsuario.FechaYHora = pFechaHora.ToString();
            _informeUsuario.Lector = pLector;

            RC.ControlAcceso.BaseDatos.LinqDALDataContext __DB = new LinqDALDataContext();
            //__DB.informeusuario.
            _DB.informeusuario.InsertOnSubmit(_informeUsuario);
            _DB.SubmitChanges();
        }
        public void Actualizar(string pEmpleado, string pEvento, DateTime pFechaHora, string pLector, int pID)
        {
            RC.ControlAcceso.BaseDatos.LinqDALDataContext __DB = new LinqDALDataContext();

            var _consulta = (from p in __DB.informeusuario where p.Id == pID select p).Single();

            _consulta.Empleado = pEmpleado;
            _consulta.FechaYHora = pFechaHora.ToString();
            _consulta.Lector = pLector;

            _DB.SubmitChanges();
        }
        /// <summary>
        /// Elimina los registros entre los ID provistos
        /// </summary>
        /// <param name="pIdDesde"></param>
        /// <param name="pIdHasta"></param>
        public static void Eliminar(int pIdDesde, int pIdHasta)
        {
            RC.ControlAcceso.BaseDatos.LinqDALDataContext __DB = new LinqDALDataContext();
            __DB.ExecuteCommand("Delete from informeUsuario where ID >= " + pIdDesde.ToString() + " and ID <= " + pIdHasta.ToString());
        }
        /// <summary>
        /// Elimina un registro por ID
        /// </summary>
        /// <param name="pID"></param>
        public static void Eliminar(int pID)
        {
            RC.ControlAcceso.BaseDatos.LinqDALDataContext __DB = new LinqDALDataContext();
            __DB.ExecuteCommand("Delete from informeUsuario where ID >= " + pID.ToString());
        }
        /// <summary>
        /// Obtiene todos los elementos
        /// </summary>
        /// <returns></returns>
        public static InformeUsuarioColeccion ObtenerTodos()
        {
            RC.ControlAcceso.BaseDatos.LinqDALDataContext _DB = new LinqDALDataContext();

            var _consulta = (from x in _DB.informeusuario select x).ToList();

            return AsignarObjetosAColeccion(_consulta);
        }
        /// <summary>
        /// Asigna los objetos resultados a una coleccion
        /// </summary>
        /// <param name="pConsulta"></param>
        /// <returns></returns>
        private static InformeUsuarioColeccion AsignarObjetosAColeccion(List<RC.ControlAcceso.BaseDatos.informeusuario> pConsulta)
        {
            InformeUsuarioColeccion _resultado = new InformeUsuarioColeccion();

            foreach (informeusuario _iu in pConsulta)
                _resultado.Add(AsignarRowAObjeto(_iu));

            return _resultado;
        }
        /// <summary>
        /// Asigna una linea del objeto resultado de consulta a un objeto.
        /// </summary>
        /// <param name="pInformUsuario"></param>
        /// <returns></returns>
        private static InformeUsuario AsignarRowAObjeto(informeusuario pInformUsuario)
        {
            InformeUsuario _resultado = new InformeUsuario();
            _resultado.ID = pInformUsuario.Id;
            _resultado.Empleado = pInformUsuario.Empleado;
            DateTime _fechaYHora;
            if (DateTime.TryParse(pInformUsuario.FechaYHora, out _fechaYHora) == false)
                _fechaYHora = CA2Parametros.FechaMinima;
            _resultado.FechaYHora = _fechaYHora;

            _resultado.Evento = enuTipoEvento.No_Definido;

            _resultado.Lector = pInformUsuario.Lector;

            return _resultado;
        }
        public static enuTipoEvento ObtenerTipoDeEvento(string pTipoEvento)
        {
            if (pTipoEvento.Substring(0, 2) == "01")
                return enuTipoEvento.Entrada;
            else if (pTipoEvento.Substring(0, 2) == "03")
                return enuTipoEvento.Salida;
            else
                throw new ArgumentException("El tipo de evento provisto no es válido");
        }

    }
    public class InformeUsuarioColeccion : System.Collections.CollectionBase
    {
        public void Add(InformeUsuario pInformeUsuario)
        {
            this.List.Add(pInformeUsuario);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public void Remove(InformeUsuario pInformeUsuario)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].ID == pInformeUsuario.ID)
                {
                    Remove(i);
                    return;
                }

            }
        }
        public InformeUsuario this[int index]
        {
            get { return ((InformeUsuario)(this.List[index])); }
            set { this.List[index] = value; }
        }
    }
}
